package algoritmo;

import poblacion.Cromosoma;
import poblacion.Poblacion;
import algoritmo.criteriodeparo.CriterioDeParo;
import algoritmo.cruzamiento.Cruzador;
import algoritmo.mutacion.Mutador;
import algoritmo.seleccion.Selector;

public class AlgoritmoGenetico {
	
	private Poblacion poblacion;
	
	private Selector selector;
	private Cruzador cruzador;
	private Mutador mutador;
	private CriterioDeParo criterioDeParo;
	
	public Poblacion ejecutar(Poblacion inicial){
		
		this.poblacion=inicial;
		
		do {
			this.poblacion = this.selector.seleccionar(poblacion);
			this.poblacion = this.cruzador.cruzar(poblacion);
			this.mutador.mutar(poblacion);
			
		} while (!criterioDeParo.cumpleCriterio(poblacion));
		
		return poblacion;
		
	}
	             
	public AlgoritmoGenetico(Selector selector, Cruzador cruzador,
			Mutador mutador, CriterioDeParo criterioDeParo) {
		super();
		this.selector = selector;
		this.cruzador = cruzador;
		this.mutador = mutador;
		this.criterioDeParo = criterioDeParo;
	}

	public void setSelector(Selector selector) {
		this.selector = selector;
	}
	public void setCruzador(Cruzador cruzador) {
		this.cruzador = cruzador;
	}
	public void setMutador(Mutador mutador) {
		this.mutador = mutador;
	}
	public void setCriterioDeParo(CriterioDeParo criterioDeParo) {
		this.criterioDeParo = criterioDeParo;
	}

	public Cromosoma getSolucion(int indice) {
		return this.poblacion.getCromosomas().get(indice);
		
	}
	
}
